import axios from 'axios'
// import { CancelToken } from 'axios'
import store from '@/store'
// import router from '@/router'
import {Toast, Dialog} from 'vant'
import qs from 'qs'
import {Base64} from 'js-base64'

import {getToken} from '@/utils/auth'

const errorCode = {
    200: '服务器成功返回请求的数据。',
    201: '新建或修改数据成功。',
    202: '一个请求已经进入后台排队（异步任务）。',
    204: '删除数据成功。',
    400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
    401: '认证失败，无法访问系统资源',
    403: '当前操作没有权限',
    404: '访问资源不存在',
    405: '请求错误，请检查参数',
    406: '请求的格式不可得。',
    410: '请求的资源被永久删除，且不会再得到的。',
    422: '当创建一个对象时，发生一个验证错误。',
    500: '服务器发生错误，请检查服务器。',
    502: '网关错误。',
    503: '服务不可用，服务器暂时过载或维护。',
    504: '网关超时。',
    default: '系统未知错误，请反馈给管理员'
}
console.log('env', import.meta.env)
axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// let cancel
const service = axios.create({
    baseURL: import.meta.env.VITE_USER_NODE_ENV === 'development' ? '/api' : import.meta.env.VITE_BASIC_URL,
    timeout: 30 * 1000,
    // 请求是否携带cookie
    withCredentials: true
    // cancelToken: new CancelToken(function (c) {
    //   cancel = c
    // })
})
// 请求拦截器
service.interceptors.request.use(
    (config) => {
        //headers判断是否需要
        const authorization = config.authorization === false
        if (!authorization) {
            config.headers['Authorization'] = 'Basic ' + Base64.encode('saber' + ':' + 'saber_secret')
        }
        // token
        config.headers['Blade-Auth'] = 'bearer ' + getToken()
        config.headers['Channel-Code'] = store.getters['channelCode']
        config.headers['Tenant-Id'] = localStorage.getItem('tenantId')

        if (config.method === 'x-www-form') {
            config.headers = {
                ...config.headers,
                'Content-type': 'application/x-www-form-urlencoded;charset=UTF-8',
                'X-Requested-With': 'XMLHttpRequest'
            }
            config.method = 'post'
            config.data = qs.stringify(config.data)
        } else if (config.method == 'blob') {
            config.responseType = 'blob'
            config.method = 'post'
        }

        return config
    },
    (err) => {
        console.log(err)
    }
)
// 响应拦截器
service.interceptors.response.use(
    (response) => {
        return new Promise((resolve, reject) => {
            const {data: res} = response
            if (res.access_token) {
                resolve(res)
                return
            }
            if (res.code !== 200) {
                // 登录过期 其余情况再加
                if (res.code === 501) {
                    // cancel()
                    // Dialog.confirm({
                    //   title: '提示',
                    //   message: '重新登录',
                    //   confirmButtonColor: '#4971FF'
                    // })
                    //   .then(() => {
                    //     store.dispatch('user/resetToken').then(() => {
                    //       location.reload() // 为了重新实例化vue-router对象 避免bug
                    //     })
                    //   })
                    //   .catch(() => {
                    //     console.log('取消登录')
                    //   })
                    reject(res)
                } else {
                    // 服务器内部错误
                    // if (res.code != 110) {
                    Toast(res.message)
                    // }
                    // 手机号未注册 跳转到绑定注册页面
                    // if (res.code == 511) {
                    //   router.push('/register')
                    // }
                    reject(res)
                }
            } else {
                // if (res.data && res.data.hasOwnProperty('isEnable') && !res.data.isEnable) {
                //   cancel()
                // }
                // 最终返回
                resolve(res.data)
            }
        })
    },
    (err) => {
        const errorText = errorCode[err.response?.status] || err.message
        if (err.response?.status == 401) {
            return Promise.reject(err.response.data)
        } else if (err.response?.status == 400) {
            Toast(err.response.data.msg)
            return Promise.reject(err)
        }
        Toast(errorText)
        return Promise.reject(err)
    }
)
export default service
